package org.fujay.langchain4jserver.application.service;

import org.fujay.commons.langchain4j.param.Message;
import org.fujay.langchain4jserver.application.command.StartConversationCommand;
import org.fujay.langchain4jserver.application.dto.ConversationDetailDTO;
import org.fujay.langchain4jserver.application.dto.ConversationSummaryDTO;
import org.fujay.langchain4jserver.application.dto.SendMessageRequest;
import org.fujay.langchain4jserver.domain.application.vo.AppId;
import org.fujay.langchain4jserver.domain.conversation.vo.ConversationId;
import org.fujay.langchain4jserver.domain.conversation.vo.UserId;
import reactor.core.publisher.Flux;

import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;

/**
 * 对话应用服务接口
 */
public interface ConversationService {

    /**
     * 开始一个新的对话
     *
     * @param command 开始对话命令对象
     * @return 创建的对话概要信息 DTO
     */
    ConversationSummaryDTO startConversation(StartConversationCommand command); // 使用 Command

    /**
     * 发送消息到现有对话
     *
     * @param conversationId 对话ID (保持领域对象)
     * @param messageRequest 用户输入消息 DTO
     * @return AI 回复消息 DTO
     */
    Flux<Message> sendMessage(ConversationId conversationId, SendMessageRequest messageRequest);

    /**
     * 获取指定ID的对话（包含所有消息）
     *
     * @param conversationId 对话ID (保持领域对象)
     * @return 对话详情 DTO Optional
     */
    Optional<ConversationDetailDTO> getConversation(ConversationId conversationId);

    /**
     * 列出指定用户和应用的对话（概要信息）
     *
     * @param userId 用户ID (保持领域对象)
     * @param appId  应用ID (保持领域对象, 可选)
     * @return 对话概要 DTO 列表
     */
    List<ConversationSummaryDTO> listConversations(UserId userId, AppId appId);

    /**
     * 删除指定ID的对话
     *
     * @param conversationId 对话ID (保持领域对象)
     */
    void deleteConversation(ConversationId conversationId);

    public default Consumer<Message> doOnCompleteConsumer(String userId, String memoryId) {
        return message -> {
            // 对话完毕后的回调，处理对话历史入库等后置操作
            // log.error("对话进入回调,用户Id:{},会话Id:{},消息:{}",userId,memoryId, JsonUtils.toJsonString(message));
        };
    }
}
